#ifndef BUTTON_H_
#define BUTTON_H_

#include <driver/gpio.h>
#include <iot_button.h>
#include <functional>

/**
 * @brief 按钮类
 * 
 * 封装了ESP-IDF按钮驱动，提供简单的按钮事件回调接口
 */
class Button {
public:
#if CONFIG_SOC_ADC_SUPPORTED
    /**
     * @brief 使用ADC配置创建按钮
     * 
     * @param cfg ADC按钮配置
     */
    Button(const button_adc_config_t& cfg);
#endif
    /**
     * @brief 使用GPIO创建按钮
     * 
     * @param gpio_num GPIO引脚号
     * @param active_high 是否高电平有效，默认为低电平有效
     */
    Button(gpio_num_t gpio_num, bool active_high = false);
    
    /**
     * @brief 析构函数
     * 
     * 释放按钮资源
     */
    ~Button();

    /**
     * @brief 设置按下回调函数
     * 
     * @param callback 按下时执行的回调函数
     */
    void OnPressDown(std::function<void()> callback);
    
    /**
     * @brief 设置释放回调函数
     * 
     * @param callback 释放时执行的回调函数
     */
    void OnPressUp(std::function<void()> callback);
    
    /**
     * @brief 设置长按回调函数
     * 
     * @param callback 长按时执行的回调函数
     */
    void OnLongPress(std::function<void()> callback);
    
    /**
     * @brief 设置单击回调函数
     * 
     * @param callback 单击时执行的回调函数
     */
    void OnClick(std::function<void()> callback);
    
    /**
     * @brief 设置双击回调函数
     * 
     * @param callback 双击时执行的回调函数
     */
    void OnDoubleClick(std::function<void()> callback);
private:
    /**
     * @brief 按钮使用的GPIO引脚号
     */
    gpio_num_t gpio_num_;
    
    /**
     * @brief ESP-IDF按钮驱动句柄
     */
    button_handle_t button_handle_ = nullptr;


    /**
     * @brief 按下事件回调函数
     */
    std::function<void()> on_press_down_;
    
    /**
     * @brief 释放事件回调函数
     */
    std::function<void()> on_press_up_;
    
    /**
     * @brief 长按事件回调函数
     */
    std::function<void()> on_long_press_;
    
    /**
     * @brief 单击事件回调函数
     */
    std::function<void()> on_click_;
    
    /**
     * @brief 双击事件回调函数
     */
    std::function<void()> on_double_click_;
};

#endif // BUTTON_H_
